package cn.jia.spring4.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 切面类
 * Created by jia on 2018/3/30.
 */
//@Component
//@Aspect
public class Audience {
    public Audience(){
        System.out.println("切面类无参构造方法。。。");
    }
    //定义总切面表达式 within(cn.jia.spring4) 当该包下任意方法被调用时，
    //@Pointcut("execution(* cn.jia.spring4.target.Performance.perform(..)) && within(cn.jia.spring4.*)")
    //@Pointcut("execution(* cn.jia.spring4.target.Performance.perform(..)) && bean(audience)")
   /* @Pointcut("execution(* cn.jia.spring4.target.impl.PerformanceImpl.perform(..))")
    public void performance() {
    }*/

    //前置通知
    //@Before("performance()")
    public void silenceCellPhone() {
        System.out.println("关掉手机！");
    }

    //后置通知
    //@Before("performance()")
    public void takeSeats() {
        System.out.println("坐下来！");
    }
    //在方法返回时调用 @After是在方法返回或者抛出异常后调用
    //@AfterReturning("performance()")
    public void applause() {
        System.out.println("鼓掌！");
    }

    //抛出异常通知
    //@AfterThrowing("performance()")
    public void demandRefund() {
        System.out.println("要求退款！");
    }
    //环绕通知
    //@Around("performance()")
    public void watchPerformance(ProceedingJoinPoint joinPoint){
        try {
            System.out.println("。。。。。。环绕通知。。。。。。。。");
            System.out.println("坐下来！");
            System.out.println("关手机！");
            //joinPoint.proceed(); //执行方法，如果该方法不被调用的话，那么会阻塞其他的通知方法
            //joinPoint.proceed(); //也可以多次调用该方法
            joinPoint.proceed();
            System.out.println("鼓掌！");
        }catch (Throwable e){
            System.out.println("要求退款！");
        }
    }

}
